package com.xian.d3_polymorphic_convert;
/**
 * 1．引用数据类型的类型转换，有几种方式?
 * ·自动类型转换、强制类型转换。
 * 2．强制类型转换能解决什么问题?强制类型转换需要注意什么。
 * 可以转换成真正的子类类型，从而调用子类独有功能。
 * ●有继承关系/实现的2个类型就可以进行强制转换，编译无问题。
 * ●运行时，如果发现强制转换后的类型不是对象真实类型则报错。
 * 类型转换异常:ClassCastException
 */

/**
 * 自动类型转换（从子到父):子类对象赋值给父类类型的变量指向。
 * 强制类型转换吗（从父到子)
 * <p>
 * 此时必须进行强制类型转换:
 * 子类对象变量=(子类)父类类型的变量
 * 作用:可以解决多态下的劣势，可以实现调用子类独有的功能。
 * <p>
 * 注意:如果转型后的类型和对象真实类型不是同一种类型，那么在转换的时候就会出现ClassCastException
 * Animal t = new Tortoise();
 * Dog d = (Dog)t;//出现异常ClassCastException
 * <p>
 * Java建议强转转换前使用instanceof判断当前对象的真实类型，再进行强制转换
 * 变量名instanceof 真实类型
 * 判断关键字左边的变量指向的对象的真实类型，是否是右边的类型或者是其子类类型，是则返回true，反之。
 */
public class Test {
    public static void main(String[] args) {
        //目标:学习多态形式下的类中转换机制。

        //自动类型转换
        Animal a = new Dog();
        a.run();
        //a.lookDoor();  //多态下无法调用子类独有功能

        //强制类型转换
        Dog d = (Dog) a;
        d.lookDoor();

        //注意:多态下直接强制类型转换，可能出现类型转换异常
        //规定:有继承或者实现关系的2个类型就可以强制类型转换,运行时可能出现问题。
//        Tortoise t = (Tortoise) a;

        //建议强制转换前，先判断变量指向对象的真实类型，再强制类型转换。
        if (a instanceof Tortoise) {
            Tortoise t = (Tortoise) a;
            t.layEggs();
        } else if (a instanceof Dog){
            Dog d1 = (Dog) a;
            d1.lookDoor();
        }
    }
}
